#pragma once

#include <arpa/inet.h>
#include <netinet/in.h>
#include <string>

/**
 * 封装socket地址类型
 * InetAddress 类封装了网络地址（IPv4）的相关操作，主要用于处理 sockaddr_in 结构体。
 * 它提供了方便的接口来创建、转换和操作网络地址。
 */
class InetAddress
{
public:
    /**
     * 作用：创建一个网络地址，指定端口和 IP 地址。
     * 参数：
     * port：端口号（默认为 0）。
     * ip：IP 地址（默认为 "127.0.0.1"）
     */
    explicit InetAddress(uint16_t port = 0, std::string ip = "127.0.0.1");

    // 作用：从已有的 sockaddr_in 结构体创建 InetAddress 对象
    explicit InetAddress(const sockaddr_in &addr)
        : addr_(addr)
    {
    }

    std::string toIp() const;
    std::string toIpPort() const;
    uint16_t toPort() const;

    // 返回底层 sockaddr_in 的指针。
    const sockaddr_in *getSockAddr() const { return &addr_; }
    // 设置底层 sockaddr_in 的值。
    void setSockAddr(const sockaddr_in &addr) { addr_ = addr; }

private:
    sockaddr_in addr_;
};